package com.biyabi.service.impl;

import com.biyabi.pojo.Cart;
import com.biyabi.pojo.CartItem;
import com.biyabi.pojo.Result;
import com.biyabi.service.CartService;
import org.springframework.data.redis.core.BoundValueOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;

import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@Service("cartService")
public class CartServiceImpl implements CartService {
    @Resource
    private RedisTemplate redisTemplate;
    @Override
    public Result addCartToRedis(String userId, CartItem cartItem) {
        String cartRedisKey = DigestUtils.md5DigestAsHex((userId + "cart").getBytes());
        ValueOperations cartoptions = redisTemplate.opsForValue();
        Cart cartRedis = (Cart)cartoptions.get(cartRedisKey);
        if(cartRedis!=null){
            Map<String, CartItem> cartItems = cartRedis.getCartItems();
            if(cartItems.containsKey(cartItem.getId())){
                //如果redis中已经有了该商品，则把商品个数加1，再存入到redis中
                CartItem cartItemMap = cartItems.get(cartItem.getId());
                int sum = cartItemMap.getSum() + cartItem.getSum();
                cartItemMap.setSum(sum);
                cartItems.put(cartItemMap.getId(),cartItemMap);
                cartRedis.setCartItems(cartItems);
                Double total=0.0;
                for (String key : cartItems.keySet()) {
                    CartItem cartItem1 = cartItems.get(key);
                    System.out.println(cartItem1.getSkuPojo().getDiscount());
                    total += cartItem1.getSum() * cartItem1.getSkuPojo().getOriginPrice()*cartItem1.getSkuPojo().getDiscount();
                }
                cartRedis.setTotalPrice(total);
                cartoptions.set(cartRedisKey,cartRedis);
            }
        }else{
            cartRedis = new Cart();
            Map<String, CartItem> cartItems = new HashMap<String, CartItem>();
            cartItems.put(cartItem.getId(),cartItem);
            cartRedis.setCartItems(cartItems);
            cartRedis.setTotalPrice(cartItem.getSkuPojo().getOriginPrice()*cartItem.getSum()*cartItem.getSkuPojo().getDiscount());
            cartoptions.set(cartRedisKey,cartRedis);
        }
        Result result = new Result(true, "商品已经成功添加到购物车，可点击查看");
        return result;

    }

    @Override
    public Cart getCartFromRedis(String userId) {
        String cartRedisKey = DigestUtils.md5DigestAsHex((userId + "cart").getBytes());
        BoundValueOperations boundValueOperations = redisTemplate.boundValueOps(cartRedisKey);
        Cart cartRedis = (Cart)boundValueOperations.get();
        return cartRedis;
    }

    @Override
    public Result delProductFromRedis(String userId, String productId) {
        String cartRedisKey = DigestUtils.md5DigestAsHex((userId + "cart").getBytes());
        ValueOperations cartoptions = redisTemplate.opsForValue();
        Cart cartRedis = (Cart)cartoptions.get(cartRedisKey);
        double totalPrice = cartRedis.getTotalPrice();
        if(cartRedis!=null){
            Map<String, CartItem> cartItems = cartRedis.getCartItems();
            if(cartItems.containsKey(productId)){
                CartItem cartItem = cartItems.get(productId);
                int sum = cartItem.getSum();
                Double originprice = cartItem.getSkuPojo().getOriginPrice()*cartItem.getSkuPojo().getDiscount();
                double v = sum * originprice;
                totalPrice=totalPrice-v;
                cartItems.remove(productId);
            }
            cartRedis.setTotalPrice(totalPrice);
            cartoptions.set(cartRedisKey,cartRedis);
        }

        return new Result(true,"已从购物车中删除");
    }
}
